#include <iostream>
#include <string>
#include <fstream>
#include "bundle.h"

int main(int argc, char *argv[])
{
	std::cout << "压缩文件名称:  " << argv[1] << std::endl;
	std::cout << "解压缩文件名称:  " << argv[2] << std::endl;

	const char *ifilename = argv[1];
	const char *ofilename = argv[2];

	std::ifstream ifs;
	ifs.open(ifilename, std::ios_base::binary);
	ifs.seekg(0, std::ios_base::end);
	size_t fsize = ifs.tellg();
	ifs.seekg(0, std::ios_base::beg);
	std::string Body;
       	Body.resize(fsize);
	ifs.read(&Body[0], fsize);
	ifs.close();
	//解压缩	
	std::string unpacked = bundle::unpack(Body);

	std::ofstream ofs;
	ofs.open(ofilename, std::ios_base::binary);
	ofs.write(&unpacked[0], unpacked.size());
	ofs.close();

	return 0;
}






//#include <iostream>
//#include <string>
//#include <fstream>
//#include "bundle.h"
//
//int main(int argc, char *argv[])
//{
//    std::cout << "原文件名称：" << argv[1] << std::endl;
//    std::cout << "压缩文件名称：" << argv[2] << std::endl;
//
//    if(argc < 3) return -1;
//
//    const char *ifilename = argv[1];
//    const char *ofilename = argv[2];
//
//    std::ifstream ifs;
//    ifs.open(ifilename, std::ios_base::binary); //打开原文件
//    ifs.seekg(0, std::ios_base::end); //将读写位置移动到末尾
//    size_t fsize = ifs.tellg(); //获取末尾偏移量 --> 文件长度
//    ifs.seekg(0, std::ios_base::beg); //将读写位置移动到文件开头
//    std::string Body; 
//    Body.resize(fsize); //调整Body大小为文件大小
//    ifs.read(&Body[0], fsize); //将原文件数据读到Body中
//
//    std::string packed = bundle::pack(bundle::LZIP, Body); //以LZIP的方式对数据进行压缩
//
//    std::ofstream ofs;
//    ofs.open(ofilename, std::ios_base::binary); //打开压缩文件
//    ofs.write(&packed[0], packed.size()); //将压缩好的数据写入压缩文件中
//
//    ifs.close();
//    ofs.close();
//    www
//    return 0;
//}





// #include <iostream>
// #include <sstream>
// #include <string>
// #include <memory>
// #include <jsoncpp/json/json.h>

// int main()
// {
//     const char *name = "赖奕铭";
//     int age = 18;
//     float score[] = {88, 96, 99.8};

//     //序列化
//     Json::Value root;
//     root["姓名"] = "赖奕铭";
//     root["年龄"] = 18;
//     root["成绩"].append(88);
//     root["成绩"].append(96);
//     root["成绩"].append(99.8);

//     Json::StreamWriterBuilder swb;
//     std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
//     std::stringstream ss;
//     sw->write(root, &ss);

//     std::cout << ss.str() << std::endl;

//     return 0;
// }


// class A
// {
// public:
// 	A(int a)
// 		:_a(a)
// 	{}

// 	//explicit operator int()
// 	operator int ()
// 	{
// 		return _a;
// 	}

// 	operator bool()
// 	{
// 		return _a;
// 	}

// 	int _a;
// };

// int main()
// {
// 	// 自定义类型<-内置类型
// 	A aa1 = 100;

// 	// 内置类型<-自定义类型
// 	int i = aa1;
// 	cout << i << endl;

// 	//double d = aa1;
// 	//int* ptr = aa1;

// 	bool ret = aa1;
// 	cout << ret << endl;

// 	int a, b;
// 	while (cin>>a>>b)  // cin.operator>>(a).operator>>(b).operator bool()
// 	{
// 		cout << a << endl;
// 		cout << b << endl;
// 	}

// 	return 0;
// }


// class Date
// {
// 	friend ostream& operator << (ostream& out, const Date& d);
// 	friend istream& operator >> (istream& in, Date& d);
// public:
// 	Date(int year = 1, int month = 1, int day = 1)
// 		:_year(year)
// 		, _month(month)
// 		, _day(day)
// 	{}

// 	/*operator string()
// 	{
// 		string str;
// 		str += to_string(_year);
// 		str += ' ';
// 		str += to_string(_month);
// 		str += ' ';
// 		str += to_string(_day);
// 		return str;
// 	}*/

// 	operator bool()
// 	{
// 		// 这里是随意写的，假设输入_year为0，则结束
// 		if (_year == 0)
// 			return false;
// 		else
// 			return true;
// 	}
// private:
// 	int _year;
// 	int _month;
// 	int _day;
// };

// istream& operator >> (istream& in, Date& d)
// {
// 	in >> d._year >> d._month >> d._day;
// 	return in;
// }

// ostream& operator << (ostream& out, const Date& d)
// {
// 	out << d._year << " " << d._month << " " << d._day;
// 	return out;
// }

// #include<fstream>

// int main()
// {
// 	Date d(2023, 10, 14);
// 	FILE* fin = fopen("file.txt", "w");
// 	fwrite(&d, sizeof(Date), 1, fin);
// 	fclose(fin);
// 	string str = d;
// 	fputs(str.c_str(), fin);

// 	ofstream ofs("file.txt", ios_base::out | ios_base::binary);
// 	ofstream ofs("file.txt");
// 	// 二进制的方式
// 	ofs.write((const char*)&d, sizeof(d));
	
// 	// 文本的方式
// 	ofs << d;

// 	return 0;
// }





// #include <iostream>
// #include <sstream>
// #include <string>
// #include <memory>
// #include <jsoncpp/json/json.h>

// int main()
// {
//     const char *name = "小明";
//     int age = 18;
//     float score[] = {88, 96, 99.8};

//     Json::Value root;
//     root["姓名"] = name;
//     root["年龄"] = age;
//     root["成绩"].append(88);
//     root["成绩"].append(96);
//     root["成绩"].append(99.8);

//     Json::StreamWriterBuilder swb;
//     std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
//     std::stringstream ss;
//     sw->write(root, &ss);

//     std::cout << ss.str() << std::endl;
//     return 0;
// }


// struct ServerInfo
// {
// 	char _address[32];
// 	// 二进制读写不能用string vector这样的对象存数据
// 	// 否则写出去就是一个指针，进程结束就是野指针，另一个进程再读进来进坑了
// 	//string _address;
// 	int _port;

// 	Date _date;
// };

// struct ConfigManager
// {
// public:
// 	ConfigManager(const char* filename = "file.txt")
// 		:_filename(filename)
// 	{}

// 	// 二进制读写 -- 简单高效，缺点：写到文件中的内容看不懂
// 	void WriteBin(const ServerInfo& info)
// 	{
// 		ofstream ofs(_filename, ios_base::out | ios_base::binary);
// 		ofs.write((const char*)&info, sizeof(info));
// 	}

// 	void ReadBin(ServerInfo& info)
// 	{
// 		ifstream ifs(_filename, ios_base::in | ios_base::binary);
// 		ifs.read((char*)&info, sizeof(info));
// 	}

// 	void WriteText(const ServerInfo& info)
// 	{
// 		ofstream ofs(_filename);
// 		ofs << info._address <<" "<< info._port <<" "<< info._date;
// 	}

// 	void ReadText(ServerInfo& info)
// 	{
// 		ifstream ifs(_filename);
// 		ifs >> info._address >> info._port >> info._date;
// 	}
// private:
// 	string _filename; // 配置文件
// };

// int main()
// {
// 	ServerInfo winfo = { "192.0.0.1111111111111111111", 80, { 2022, 4, 10 } };
// 	ConfigManager cm("test.bin");
// 	cm.WriteBin(winfo);

// 	return 0;
// }

// int main()
// {
// 	ConfigManager cf_bin("test.bin");
// 	ServerInfo rbinfo;
// 	cf_bin.ReadBin(rbinfo);
// 	cout << rbinfo._address << "  " << rbinfo._port << "  " << rbinfo._date << endl;

// 	return 0;
// }

// int main()
// {
// 	ServerInfo winfo = { "192.0.0.1111111111111111111", 80, { 2022, 4, 10 } };
// 	ConfigManager cm("test.txt");
// 	cm.WriteText(winfo);

// 	return 0;
// }

// int main()
// {
// 	ConfigManager cf_bin("test.txt");
// 	ServerInfo rbinfo;
// 	cf_bin.ReadText(rbinfo);
// 	cout << rbinfo._address << "  " << rbinfo._port << "  " << rbinfo._date << endl;

// 	return 0;
// }

// int main()
// {
// 	ifstream ifs("Test.cpp");
// 	char ch;
// 	while (ifs.get(ch))
// 	{
// 		cout << ch;
// 	}

// 	return 0;
// }
